#ifndef PAGENUMBERCONFIGFACADE_H
#define PAGENUMBERCONFIGFACADE_H

#include <QString>
#include <QStringList>
#include <QFont>
#include <QColor>
#include "pagenumberformatter.h"

// 前向声明
class ProcessingSettings;
class SystemConfig;
class PagePositionSystem;
class GridPageNumberSystem;

/**
 * @brief Martin Fowler重构：Facade Pattern for Page Number Configuration
 *
 * 解决代码异味：
 * - Complex Subsystem: 统一多个配置子系统的访问
 * - Shotgun Surgery: 集中配置变更的影响
 * - Feature Envy: 封装跨多个类的配置操作
 *
 * 设计原则：
 * - Facade Pattern: 提供统一的配置接口
 * - Single Responsibility: 专注于页码配置管理
 * - Delegation: 委托给具体的配置类实现
 */
class PageNumberConfigFacade
{
public:
    /**
     * @brief 获取门面实例（单例模式）
     */
    static PageNumberConfigFacade& instance();

    /**
     * @brief 设置配置依赖（依赖注入）
     */
    void setProcessingSettings(ProcessingSettings* settings);
    void setSystemConfig(SystemConfig* config);

    // =================================================================
    // 页码格式配置门面
    // =================================================================

    /**
     * @brief 获取当前页码格式
     */
    QString getCurrentFormat() const;

    /**
     * @brief 设置页码格式
     */
    void setCurrentFormat(const QString& format);

    /**
     * @brief 获取预设格式列表
     */
    QStringList getPresetFormats() const;

    /**
     * @brief 获取格式描述
     */
    QString getFormatDescription(const QString& format) const;

    /**
     * @brief 验证格式是否有效
     */
    bool isValidFormat(const QString& format) const;

    /**
     * @brief 生成格式预览
     */
    QString generatePreview(const QString& format,
                           int sampleLocal = 5,
                           int sampleGlobal = 25,
                           int sampleTotal = 100) const;

    // =================================================================
    // 页码位置配置门面
    // =================================================================

    /**
     * @brief 获取当前页码位置
     */
    int getCurrentPosition() const;

    /**
     * @brief 设置页码位置
     */
    void setCurrentPosition(int position);

    /**
     * @brief 获取可用位置列表
     */
    QStringList getAvailablePositions() const;

    // =================================================================
    // 页码样式配置门面
    // =================================================================

    /**
     * @brief 获取当前字体
     */
    QFont getCurrentFont() const;

    /**
     * @brief 设置字体
     */
    void setCurrentFont(const QFont& font);

    /**
     * @brief 获取当前颜色
     */
    QColor getCurrentColor() const;

    /**
     * @brief 设置颜色
     */
    void setCurrentColor(const QColor& color);

    /**
     * @brief 获取预设字体列表
     */
    QStringList getPresetFonts() const;

    /**
     * @brief 获取预设字体大小列表
     */
    QList<int> getPresetFontSizes() const;

    // =================================================================
    // 页码显示控制门面
    // =================================================================

    /**
     * @brief 页码是否启用
     */
    bool isPageNumberEnabled() const;

    /**
     * @brief 设置页码启用状态
     */
    void setPageNumberEnabled(bool enabled);

    /**
     * @brief 封面是否显示页码
     */
    bool isShowOnCover() const;

    /**
     * @brief 设置封面显示页码
     */
    void setShowOnCover(bool show);

    /**
     * @brief 获取起始页码
     */
    int getStartNumber() const;

    /**
     * @brief 设置起始页码
     */
    void setStartNumber(int number);

    // =================================================================
    // 高级配置门面
    // =================================================================

    /**
     * @brief 获取透明度
     */
    double getOpacity() const;

    /**
     * @brief 设置透明度
     */
    void setOpacity(double opacity);

    /**
     * @brief 获取旋转角度
     */
    double getRotation() const;

    /**
     * @brief 设置旋转角度
     */
    void setRotation(double rotation);

    // =================================================================
    // 统一格式化门面
    // =================================================================

    /**
     * @brief 格式化页码（统一入口）
     *
     * @param localPage 本地页码
     * @param globalPage 全局页码
     * @param totalPages 总页数
     * @return 格式化后的页码字符串
     */
    QString formatPageNumber(int localPage, int globalPage, int totalPages) const;

    /**
     * @brief 应用所有配置变更
     */
    void applyAllChanges();

    /**
     * @brief 重置为默认配置
     */
    void resetToDefaults();

private:
    PageNumberConfigFacade() = default;
    ~PageNumberConfigFacade() = default;

    // 禁用拷贝和赋值
    PageNumberConfigFacade(const PageNumberConfigFacade&) = delete;
    PageNumberConfigFacade& operator=(const PageNumberConfigFacade&) = delete;

    // 配置依赖
    ProcessingSettings* m_processingSettings = nullptr;
    SystemConfig* m_systemConfig = nullptr;

    // 辅助方法
    void ensureProcessingSettings() const;
    void ensureSystemConfig() const;
};

#endif // PAGENUMBERCONFIGFACADE_H